import COS from 'cos-wx-sdk-v5'
import SparkMD5 from 'js-md5'

var key = 'h7G8k47tPecJjtlMgkX4KK3UeX9UYLr6'
// 配置
const cosConfig = {
	Bucket: 'tousubiaoyang-1301970825',
	Region: 'ap-nanjing',
	//Domain: 'newplatform-1301970825.file.myqcloud.com',
	Domain: ''
}

// 初始化实例
var _this = this;
var cos = new COS({
	getAuthorization: async function(options, callback) {
		/**
		 * 签名计算放在前端会暴露 SecretId 和 SecretKey
		 * 我们把签名计算过程放在后端实现，前端通过 ajax 向后端获取签名结果
		 * 正式部署时请再后端加一层自己网站本身的权限检验。
		 * 异步获取临时密钥
		 */
		var token = uni.getStorageSync('token');
		// var token="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJidWJibGUiLCJyb2xlIjoiWzFdIiwiaXNzIjoicmVuUnVpIiwibmFtZSI6Iuexs-iJs-aYpSIsImRlcHRJZCI6NTA0LCJtb2JpbGUiOiIxNTIqKio3MjYiLCJleHAiOjE2Njg2NTcyODIsInVzZXJpZCI6Ik1peWFuY2h1biJ9.xW-wA0ZlvhPiIgjzL0foAHeSVFzGDPMEuwdghSnMzH8";
		let header = {}

		header = {
			'content-type': 'application/x-www-form-urlencoded',
			'Authorization': token,
		}
		uni.request({
			method: 'post',
			// url:'https://mes.renkangshangcheng.cn/workorder/Upload/getQcloudTempKeys',//php版本
			url: "https://state.renruikeji.cn/api/vs/backend/bucket/getUrl", //java 正式
			// url: "https://teststate.renkangshangcheng.cn/api/vs/backend/bucket/getUrl", //java 测试
			data: {},
			header: header,
			success: function(res) {
				if (res.data.code != 0) {
					uni.showToast({
						title: res.data.message,
						icon: 'none'
					})
					return false
				}
				const authdata = res.data.data
				console.log(res)
				const auth = {
					TmpSecretId: authdata.tmpSecretId,
					TmpSecretKey: authdata.tmpSecretKey,
					XCosSecurityToken: authdata.sessionToken,
					ExpiredTime: authdata
						.expiredTime // 在ExpiredTime时间前，不会再次调用getAuthorization
				}
				callback(auth)
			}
		})

	},
	FileParallelLimit: 5, // 文件并发数
	ChunkParallelLimit: 8, // 同一个上传文件的分块并发数
	ChunkSize: 1024 * 1024 * 8 // 分块上传时，每块的字节数大小
})

// 获取cos存储的图片地址，替换为域名地址
function getObjectUrl() {
	const url = cos.getObjectUrl({
		Bucket: cosConfig.Bucket,
		Region: cosConfig.Region,
		Key: key,
		Sign: false
	}, function(err, data) {
		// console.log(err || data)
	})
	// 腾讯云的地址替换为域名地址
	//const p = `${cosConfig.Bucket}.cos.${cosConfig.Region}.myqcloud.com`
	const p = `${cosConfig.Bucket}.file.myqcloud.com`
	return url.replace(p, cosConfig.Domain)
}

// 获得文件md5
function getFileMD5(file, callback) {
	// 声明必要的变量
	const fileReader = new FileReader()
	// 文件每块分割2M，计算分割详情
	const chunkSize = 2 * 1024 * 1024;
	const chunks = Math.ceil(file.size / chunkSize)
	let currentChunk = 0

	// 创建md5对象（基于SparkMD5）
	const spark = new SparkMD5()

	// 每块文件读取完毕之后的处理
	fileReader.onload = function(e) {
		// 每块交由sparkMD5进行计算
		spark.appendBinary(e.target.result)
		currentChunk++

		// 如果文件处理完成计算MD5，如果还有分片继续处理
		if (currentChunk < chunks) {
			loadNext()
		} else {
			callback(spark.end())
		}
	}

	// 处理单片文件的上传
	function loadNext() {
		const start = currentChunk * chunkSize
		const end = start + chunkSize >= file.size ? file.size : start + chunkSize

		fileReader.readAsBinaryString(file.slice(start, end))
	}

	loadNext()
}

// 大文件分片上传-通过sliceUploadFile上传
export function uploadFile(file, callback, progressBc) {
	// 得到md5码
	getFileMD5(file, md5 => {
		// 存储文件的md5码
		file.md5 = md5

		Date.prototype.Format = function(fmt) { //author: meizz
			var o = {
				"M+": this.getMonth() + 1, //月份
				"d+": this.getDate(), //日
				"h+": this.getHours(), //小时
				"m+": this.getMinutes(), //分
				"s+": this.getSeconds(), //秒
				"q+": Math.floor((this.getMonth() + 3) / 3), //季度
				"S": this.getMilliseconds() //毫秒
			};
			if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp
				.$1.length));
			for (var k in o)
				if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length ==
					1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
			return fmt;
		}
		//路径
		const pathTime = (new Date()).Format("yyyy-MM-dd")

		const subfix = file.name.substr(file.name.lastIndexOf('.'))
		key = file.md5 + subfix;

		cos.sliceUploadFile({
			Bucket: cosConfig.Bucket,
			Region: cosConfig.Region,
			Key: "/videos/" + pathTime + "/" + key,
			Body: file,
			// FilePath:"/videos/" + pathTime + "/",
			onProgress: function(progressData) {
				progressBc(progressData.percent)
			}
		}, function(err, data) {
			if (err) {
				callback(err)
			} else {
				data.fid = getObjectUrl()
				callback(null, data)
			}
		})
	})
}

// 小文件直接上传-通过putObject上传
export function uploadFile2(file, name, coverUrl = false) {
	return new Promise((resolve, reject) => {
		// 得到md5码
		// 存储文件的md5码
		// file.md5 = md5
		// const subfix = file.name.substr(file.name.lastIndexOf('.'))

		key = "/wx-app/" + new Date().getTime() + (Math.floor(Math.random() * 10000)) + "/" + name
		cos.headObject({
			Bucket: cosConfig.Bucket,
			Region: cosConfig.Region,
			Key: key
		}, function(err, data) {
			if (err != null) {
				cos.putObject({
					Bucket: cosConfig.Bucket,
					Region: cosConfig.Region,
					Key: key,
					FilePath: file,
					onProgress: function(progressData) {
						uni.showToast({
							title: "上传进度:" + progressData.percent * 100,
							icon: "loading"
						})
					}
				}, (err, data) => {
					if (coverUrl) {
						//生成视频第一针
						get_img(key, function(res) {
							resolve(data)
						});
					} else {
						resolve(data)
					}

				})
			} else {
				uni.showToast({
					title: "当前上传人数较多，请稍等",
					icon: 'loading'
				})
				uploadFile2(file, name)
			}
		})
	})
}
//生成图片第一整
function get_img(key, request_data) {
	cos.request({
			Bucket: cosConfig.Bucket,
			Region: cosConfig.Region,
			Method: 'GET',
			Key: key,
			/* 存储桶内的媒体文件，必须字段 */
			Query: {
				'ci-process': 'snapshot',
				/** 固定值，必须 */
				time: 3,
				/** 截图的时间点，单位为秒，必须 */
				// width: 0, /** 截图的宽，非必须 */
				// height: 0, /** 截图的高，非必须 */
				// format: 'png', /** 截图的格式，支持 jpg 和 png，默认 jpg，非必须 */
				// rotate: 'auto', /** 图片旋转方式，默认为'auto'，非必须 */
				// mode: 'exactframe', /** 截帧方式，默认为'exactframe'，非必须 */
				responseType: 'arraybuffer'
			},
			RawBody: true,

		},
		function(err, data) {
			console.log(data, '测试数据')
			//图片存储到存储桶
			cos.putObject({
				Bucket: cosConfig.Bucket,
				Region: cosConfig.Region,
				Key: key.split(".")[0] + 'img.png',
				/* 存储在桶里的对象键（例如1.jpg，a/b/test.txt），必须字段 */
				Body: data.Body,
			}, function(err, data) {
				console.log(err || data.Location, '封面上传');
				request_data(key.split(".")[0] + '.png')
			});
		});
}

export function get_video_img(video_url) {
	return new Promise((resolve, reject) => {
		cos.request({
				Bucket: cosConfig.Bucket,
				Region: cosConfig.Region,
				Method: 'GET',
				Key: video_url,
				/* 存储桶内的媒体文件，必须字段 */
				Query: {
					'ci-process': 'snapshot',
					/** 固定值，必须 */
					time: 1,
					/** 截图的时间点，单位为秒，必须 */
				},
				RawBody: true,
				DataType: 'blob'
			},
			function(err, data) {
				// console.log(err || data)
				resolve(data)
			});
	})

}
// 小文件直接上传-通过putObject上传
export function uploadFile1(file, times) {
	return new Promise((resolve, reject) => {
		// 得到md5码
		// 存储文件的md5码
		// file.md5 = md5
		// const subfix = file.name.substr(file.name.lastIndexOf('.'))

		key = "/gongdan/" + new Date().getTime() + "/" + file.cloudPath
		console.log(key);
		cos.headObject({
			Bucket: cosConfig.Bucket,
			Region: cosConfig.Region,
			Key: key
		}, function(err, data) {
			if (err != null) {
				cos.putObject({
					Bucket: cosConfig.Bucket,
					Region: cosConfig.Region,
					Key: key,
					Body: file.file,
					onProgress: function(progressData) {
						uni.showToast({
							title: "上传进度:" + progressData.percent * 100,
							icon: "loading"
						})
					}
				}, (err, data) => {
					resolve(data)
				})
			}
		})
	})
}
